function r = SVMRFE(label, data)
% SVM-RFE
% SVM Recursive Feature Elimination (SVM RFE)
% by liyang @BNU Math
% Email:patrick.lee@foxmail.com
% last modified 2010.09.18

n = size(data,2);           % 获取data的列数
s = 1:n;                    % 创建一个从1到n的行向量
r = [];                     % 创建一个空矩阵
iter = 1;                   % 初始化迭代次数
while ~isempty(s)           % 当s非空时
    fprintf('正在迭代: %d \\ %d\n', iter, n);
    %如果r的长度大于5, 则显示r的前5个元素
    if length(r) > 5
        fprintf('r: %d, %d, %d, %d, %d, ...\n', r(1), r(2), r(3), r(4), r(5));
    end
    
        

%     if mod(iter, 10) == 0
%         str = ['===',num2str(iter),'==='];
%         disp(str);
%         disp('processing .....');
%     end
    X = data(:,s);          % 从data中提取s列
    % v = 3   
    % [bestCVaccuracy,bestc,bestg] = SVMcgForClass(label, X, ...
    %     -8,8,-8,8,v,0.8,0.8,4.5);
    cmd = ['-c ','1048576',' -g ','9.536743164062500e-07'];
    model = svmtrain(label', X, cmd);

    % 训练SVM模型, label标签, X为经过s列挑选后的数据
    % model = svmtrain(label', X);

    % 提取支持向量的权重
    % SVs: 支持向量, 位于中位边界附近的关键样本点
    % sv_coef: 支持向量的系数, 用于计算决策函数, 也称为拉格朗日乘子
    w1 = model.SVs' * model.sv_coef(:, 1);   % 修改: sv_coef中的每一列都是一个分类的权重, 现在仅考虑第一列

    % 计算权重向量的模(权重的平方和)
    c = w1.^2;
    

    % 找到权重最小的列
    % min()返回: [最小的值, 最小值的索引]
    [wa, wb] = min(w1);
    [sc, sd] = min(model.sv_coef(:,1));
    [c_minvalue, f] = min(c);
    fprintf("sv_coef中最小的是: %f, 位置是%d\n", sc, sd);
    fprintf("w中,最小值:%f \t 位置:%d\n", wa, wb);
    fprintf("c中,最小值:%f \t 位置:%d\n", c_minvalue, f);

    % 排序: 已知f为最小值索引, s为从1~n的行向量,
    % [s(f), r] 将s中f索引的值放在r的开头, 后面跟着r
    % 再将连接好的行向量复制给r. 
    % 所以, r中将保存权重从大到小的值
    r = [s(f),r];

    % 创建了一个新的行向量, 从1到n, 唯独去掉f索引的值
    ind = [1:f-1, f+1:length(s)];
    
    % 将s中f索引的值去掉, 重新赋值给s
    s = s(ind);
    iter = iter + 1;
end
